package com.lxx.jmb2c.config;

import com.lxx.jmb2c.interceptors.AuthorizationInterceptor;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Web MVC配置类
 * 
 * 这个类用于配置Spring MVC相关设置，包括：
 * 1. 拦截器配置
 * 2. 跨域配置
 * 3. 静态资源处理
 * 4. 视图解析器等
 * 
 * 当前主要配置了授权拦截器，用于：
 * - 验证请求的JWT令牌
 * - 检查用户权限
 * - 设置线程上下文信息
 * 
 * 安全注意事项：
 * 1. 拦截器路径要仔细设计
 * 2. 静态资源和公开API要排除拦截
 * 3. 敏感操作需要额外权限验证
 * 
 * 初学者需要了解：
 * - @Configuration 表示这是一个配置类
 * - WebMvcConfigurer 是Spring MVC配置接口
 * - 拦截器在Controller方法执行前/后执行
 * 
 * @author lxx
 * @since 2025-07-02
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * 授权拦截器，用于验证JWT令牌
     */
    @Resource
    private AuthorizationInterceptor authorizationInterceptor;

    /**
     * 添加拦截器配置
     * 
     * 配置说明：
     * - 拦截所有路径(/**)
     * - 排除登录、静态资源、Swagger等公开路径
     * 
     * 排除路径设计考虑：
     * 1. 登录接口需要公开访问
     * 2. 静态资源不需要权限验证
     * 3. API文档需要公开访问
     * 4. 错误页面需要公开访问
     * 
     * @param registry 拦截器注册表
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/**/login",
                        "/doc.html",
                        "/webjars/**",
                        "/swagger-resources/**",
                        "/v3/api-docs/**",
                        "/**/favicon.ico",
                        "/error",
                        "/**/**.json",
                        "/static/**",
                        "/public/**",
                        "/resources/**",
                        "/META-INF/resources/**",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js",
                        "/**/*.png",
                        "/**/*.jpg",
                        "/**/*.jpeg",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.ico",
                        "/**/*.ttf",
                        "/**/*.woff",
                        "/**/*.woff2",
                        "/**/*.eot");
    }
}
